package com.elong.businesstravel;

import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;

import com.android.support.jhf.debug.DebugLog;
import com.android.support.jhf.debug.WriteLogCat;
import com.android.support.jhf.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.android.support.jhf.universalimageloader.core.DisplayImageOptions;
import com.android.support.jhf.universalimageloader.core.ImageLoader;
import com.android.support.jhf.universalimageloader.core.ImageLoaderConfiguration;
import com.android.support.jhf.universalimageloader.core.assist.ImageScaleType;
import com.android.support.jhf.universalimageloader.core.assist.QueueProcessingType;
import com.android.support.jhf.utils.AndroidUniqueSerialNumber;
import com.android.support.jhf.utils.DateUtils;
import com.baidu.location.BDLocation;
import com.elong.businesstravel.base.baidusdk.map.InitBaiduMap;
import com.elong.businesstravel.base.utils.AppUserId;
import com.elong.businesstravel.entitys.City;
import com.elong.businesstravel.entitys.HotelSearchCondition;
import com.elong.businesstravel.include.Version;
import com.umeng.message.PushAgent;
import com.umeng.message.UHandler;
import com.umeng.message.UmengRegistrar;
import com.umeng.message.entity.UMessage;

import android.graphics.Bitmap;
import android.app.Application;
import android.content.Context;
import android.os.Build;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import android.util.Log;

public class ELongBusinessTravelApplication extends Application {

	private static String TAG = "ELongBusinessTravelApplication";
	/** 排序方式 */
	public String[] mHotelSorts = { "默认排序", "价格（从低到高）", "价格（从高到低）", "评价（从高到低）" };
	/** 排序方式 , 附近酒店的排序方式，添加 */
	public String[] mHotelLocSorts = { "默认排序", "价格（从低到高）", "价格（从高到低）",
			"评价（从高到低）", "距离（从近到远）" };
	/** 选择入住时间 */
	public String[] mHotelDestineDateStrings = new String[30];
	/** 价格/星级 */
	public String[] mPriceLevel = new String[] { "不限", "￥200以下", "经济连锁",
			"￥200~￥300", "三星级/舒适", "￥300~￥400", "四星级/高档", "￥400~￥600",
			"五星级/豪华", "￥600以上" };
	/** 价格/星级 用来上传到服务器的值 */
	public String[] mPriceLevelValue = new String[] { "不限", "0~200", "2",
			"200~300", "3", "300~400", "4", "400~600", "5", "600~0" };
	/** 发票类型 */
	public List<String> mInvoiceTypeList = new ArrayList<String>();
	/** 城市列表 */
	public City mCity = null;
	/** 百度定位，定位的位置 */
	public BDLocation mBdLocation;
	/** 定位当前城市 */
	public City mLocationCity;
	/** 酒店列表查询条件 */
	public HotelSearchCondition mHotelSearchCondition = new HotelSearchCondition();

	public InitBaiduMap mInitBaiduMap;
	/** 设置再调用displayImage()有效,使用loadImage()无效 */
	public DisplayImageOptions mDisplayImageOptions;
	/** 友盟推送 */
	public PushAgent mPushAgent;
	/** 判断应用主界面是否运行,false没有运行，true运行 */
	public boolean mFlagHome = false;
	/**微信联合登陆返回的Code，null授权失败，*/
	public String mWeChatCode = null;

	@Override
	public void onCreate() {
		super.onCreate();
		Log.i(TAG, "onCreate");

		// ClientSession.sHeaderUserAgent = Version.minProductName + "_"
		// + Version.versionDesc + "_" + Version.platform + "_"
		// + Build.VERSION.RELEASE + "_" + Version.market + "_"
		// + ClientSession.getInstance().IMEI;
		// NetworkClient.getNetworkClient().setDefaultUserAgent("");

		mInitBaiduMap = new InitBaiduMap(this);
		mInitBaiduMap.initEngineManager();

		factoryDate();

		initImageLoader();

		createInvoiceType();

		umentMessage();

		setRequestId();

		DebugLog.setDebug(Version.DEBUG);
	}

	/**
	 * 设置请求id
	 */
	private void setRequestId() {
		// String device_token = UmengRegistrar.getRegistrationId(this
		// );

		String androidUniqueSerialNumber = AndroidUniqueSerialNumber
				.getInstance(this).getAndroidUniqueSerialNumber();
		AppUserId.setUUId(this, androidUniqueSerialNumber);
		AppUserId.setDeviceId(this, androidUniqueSerialNumber);
	}

	private void umentMessage() {
		// 9:00 ~ 21:00可以推送
		// public void setNoDisturbMode(int startHour, int startMinute, int
		// endHour, int endMinute)
		// 例如：
		// mPushAgent.setNoDisturbMode(23, 0, 7, 0);
		mPushAgent = PushAgent.getInstance(this);
		mPushAgent.setDebugMode(true);

		// 如果想使用SDK提供的通知展示消息， 但是只是想自定义点击行为， 可以调用下面的接口。
		UHandler notifyClickHandler = new UHandler() {

			@Override
			public void handleMessage(Context context, UMessage msg) {
				// Log.d(TAG, "add your custom message handling logic here: "
				// + msg.custom);
				// try {
				// JSONObject json = new JSONObject(msg.custom);
				// Log.d(TAG, "json=" + json.toString());
				// } catch (JSONException e) {
				// e.printStackTrace();
				// }
				// HandlerToastUI.getHandlerToastUI(getApplicationContext(),
				// "notifyClickHandler");
				//
				// PendingIntent intent = PendingIntent.getActivity(context, 0,
				// new Intent(context, MessageCenterActivity.class),
				// PendingIntent.FLAG_UPDATE_CURRENT);
				// Intent intent = new Intent(context,
				// MessageCenterActivity.class);
				// startActivity(intent);

			}
		};
		// mPushAgent.setNotificationClickHandler(notifyClickHandler);

		// 如果希望自定义消息的处理形式， 可以下面使用接口。 消息处理完全交给应用处理。SDK 不展示通知栏。此种方式不能统计消息打开动作。
		// UHandler handler = new UHandler() {
		// @Override
		// public void handleMessage(Context context, UMessage msg) {
		// Log.d(TAG, "add your custom message handling logic here: "
		// + msg.custom);
		// try {
		//
		// UTrack.getInstance(context).trackMsgClick(msg);
		// } catch (Exception e) {
		// e.printStackTrace();
		// }
		// }
		// };
		// mPushAgent.setMessageHandler(handler);
	}

	private void createInvoiceType() {
		mInvoiceTypeList.add("会务费");
		mInvoiceTypeList.add("会议费");
		mInvoiceTypeList.add("旅游费");
		mInvoiceTypeList.add("差旅费");
		mInvoiceTypeList.add("服务费");
		mInvoiceTypeList.add("住宿费");
	}

	private void initImageLoader() {
		// 1.完成ImageLoaderConfiguration的配置
		ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
				this)
				.memoryCacheExtraOptions(400, 400)
				// default = device screen dimensions
				.threadPoolSize(3)
				// default
				.threadPriority(Thread.NORM_PRIORITY - 1)
				// default
				.tasksProcessingOrder(QueueProcessingType.FIFO)
				// default
				.denyCacheImageMultipleSizesInMemory()
				.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
				.memoryCacheSize(2 * 1024 * 1024).memoryCacheSizePercentage(13) // default
				// .discCache(new UnlimitedDiscCache(cacheDir))// default
				.discCacheSize(50 * 1024 * 1024) // 缓冲大小
				.discCacheFileCount(100) // 缓冲文件数目
				// .discCacheFileNameGenerator(new HashCodeFileNameGenerator())
				// // default
				// .imageDownloader(new BaseImageDownloader(this)) // default
				// .imageDecoder(new BaseImageDecoder()) // default
				// .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
				// // default
				.writeDebugLogs().build();

		// 2.单例ImageLoader类的初始化
		ImageLoader imageLoader = ImageLoader.getInstance();
		imageLoader.init(config);

		// 3.DisplayImageOptions实例对象的配置
		// 以下的设置再调用displayImage()有效，使用loadImage()无效
		mDisplayImageOptions = new DisplayImageOptions.Builder()
		// .showStubImage(R.drawable.ic_stub) // image在加载过程中，显示的图片
		// .showImageForEmptyUri(R.drawable.ic_empty) // empty URI时显示的图片
		// .showImageOnFail(R.drawable.ic_error) // 不是图片文件 显示图片
				.resetViewBeforeLoading(false) // default
				.delayBeforeLoading(1000)
				.cacheInMemory(false) // 缓存至内存
				.cacheOnDisc(true) // 缓存至手机SDCard
				.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)// default
				.bitmapConfig(Bitmap.Config.ARGB_8888) // default
				// .displayer(new SimpleBitmapDisplayer()) // default
				// 可以设置动画，比如圆角或者渐变
				// .handler(new Handler()) // default
				.build();

	}

	/**
	 * 生成一个月的数据，当天早上六点之前可以预订前一天的
	 * 
	 * @return
	 */
	private void factoryDate() {
		Calendar calendar = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);
		calendar.setTimeZone(TimeZone.getTimeZone("Hongkong"));
		String currentHH = DateUtils.getCurrentDate("HH");
		// 早上六点之前可以预订前一天的
		if (Integer.parseInt(currentHH) < 6) {
			calendar.roll(Calendar.DAY_OF_MONTH, -1);
		}
		for (int i = 0; i < mHotelDestineDateStrings.length; i++) {
			mHotelDestineDateStrings[i] = DateUtils.dateFormat(
					calendar.getTimeInMillis(), "yyyy-MM-dd (E)");
			calendar.add(Calendar.DAY_OF_MONTH, 1);
		}
	}

}
